在昨天介紹的內文中,有提及nodeSelector
,那今天就來介紹該如何指派 Pod 要放在哪一個 Node 上吧!
一般而言,Kubernetes 會自動找到適合每一個 Pod 運行的 worker node,在少數情形之下,當使用者希望能介入並指定特定 Pod 所放置的 Node,這也才有以下的需求。
先來分析一下使用情境:
想像一下,如果分別有三台 Servers 規格不同,這邊先以大中小來作為區分,而其中 Pod A 上所要執行的 workloads 需要特定硬體來進行運算與執行,因此它被規定必須要放在 Node[large] 上才能正常運作,此時該如何確保,Pod A 一定會被分派到指定 Node 上呢,而以下解法也就是所謂的 Pod 調度。
Kubernetes 具有以下幾種方法來達成上述要求:
nodeSelector: 直接在 Pod 定義規格上,指定放置到具有特殊 label 的 Node 上
Affinity/ Anti-affinity: 它還細分為兩種,分別為 Node Affinity、inter-pod affinity/ anti-affinity。
preference
,表示不一定需要完全符合條件,只是傾向於那樣的條件。nodeName: 比起上述兩種方式,更直接粗暴,直接指定 nodeName,當此 field 不為空時,scheduler 會直接略過 Pod,並且指定 Node 上的 kubelet 會直接啟動該 Pod。
Taints and Tolerations: 透過 taints(汙點)和 toleration(容忍) 來讓 Pod 盡量落在期望的 node 上運行。
可以想像為,taints 像是噴一種藥噴在人身上 (ex.防蚊液),而 toleration 則是指該昆蟲是否有容忍這味道的能力,如果有,那麼它可以落在人身上(當然也可以不要,如果牠並非以人類為利的話); 相反的,如果牠不具有 toleration,那他絕不可能有能力或機會落在人類身上。
今天先這樣囉
Don't be dicouraged; it's often the last key in the bunch that opens the lock.
共勉之